﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Data;
using System.Data.SqlClient;

namespace WebServiceApp
{
    /// <summary>
    /// Summary description for WS
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService]
    public class WS : System.Web.Services.WebService
    {
        #region Atributos

        private string _conectionString;

        #endregion

        #region Construtor

        public WS(string cx)
        {
            _conectionString = cx;
        }

        #endregion

        #region Categorias

        [WebMethod]
        [ScriptMethod]
        public DataTable GetCategorias()
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("select * from Categoria", conexao);

            try
            {
                conexao.Open();

                SqlDataAdapter sdr = new SqlDataAdapter(comando);
                DataSet ds = new DataSet();

                sdr.Fill(ds, "Categoria");

                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }


        [WebMethod]
        [ScriptMethod]
        public void InsertCategorias(string nome)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("insert into Categoria (nome) values (@nome)", conexao);
            comando.Parameters.Add(new SqlParameter("@nome", nome));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public void UpdateCategorias(int id, string nome)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("update Categoria set Nome = @nome where ID = @id", conexao);
            comando.Parameters.Add(new SqlParameter("@id", id));
            comando.Parameters.Add(new SqlParameter("@nome", nome));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public void DeleteCategorias(int id)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("delete from Categoria where id = @id", conexao);
            comando.Parameters.Add(new SqlParameter("@id", id));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        #endregion

        #region Cliente

        public void InsertCliente(string nome, string email, string senha)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("insert into Cliente (nome, email, senha) values (@nome, @email, @senha)", conexao);
            comando.Parameters.Add(new SqlParameter("@nome", nome));
            comando.Parameters.Add(new SqlParameter("@email", email));
            comando.Parameters.Add(new SqlParameter("@senha", senha));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        public void UpdateCliente(int id, string nome, string senha, string endereco, string telefone, string foto)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand(@"update Cliente
                                    set nome = @nome, senha = @senha, endereco = @endereco, telefone = @telefone, foto = @foto
                                    where id = @id", conexao);
            comando.Parameters.Add(new SqlParameter("@nome", nome));
            comando.Parameters.Add(new SqlParameter("@senha", senha));
            comando.Parameters.Add(new SqlParameter("@endereco", endereco));
            comando.Parameters.Add(new SqlParameter("@telefone", telefone));
            comando.Parameters.Add(new SqlParameter("@foto", foto));
            comando.Parameters.Add(new SqlParameter("@id", id));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        public DataTable GetClienteByEmail(string email)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("select * from Cliente where Email = @email", conexao);
            comando.Parameters.Add(new SqlParameter("@email", email));

            try
            {
                conexao.Open();

                SqlDataAdapter sdr = new SqlDataAdapter(comando);
                DataSet ds = new DataSet();

                sdr.Fill(ds, "Cliente");

                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        public bool ValidaLogin(string email, string senha)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("select * from Cliente where Email = @email and Senha = @senha ", conexao);
            comando.Parameters.Add(new SqlParameter("@email", email));
            comando.Parameters.Add(new SqlParameter("@senha", senha));

            try
            {
                conexao.Open();

                SqlDataReader sdr = comando.ExecuteReader();
                return sdr.HasRows;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        #endregion

        #region Jogos

        [WebMethod]
        [ScriptMethod]
        public DataTable GetJogos()
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("select * from Jogos", conexao);

            try
            {
                conexao.Open();

                SqlDataAdapter sdr = new SqlDataAdapter(comando);
                DataSet ds = new DataSet();

                sdr.Fill(ds, "Jogos");

                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public DataTable GetJogoByID(int id)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand(@"
                    select 
                        Jogos.ID as IDJogo,
                        Jogos.Nome as NomeJogo,
                        Jogos.Descricao as DescricaoJogo,
                        Jogos.Preco as PrecoJogo,
                        Jogos.Foto as FotoJogo,
                        Categoria.Nome as NomeCategoria,
                        Produtora.Nome as NomeProdutora 

                    from 
                        Jogos inner join Categoria 
                        on Jogos.Categoria = Categoria.ID 
                                        
                        inner join Produtora 
                        on Jogos.Produtora = Produtora.ID 

                    where 
                        Jogos.ID = @id ", conexao);
            comando.Parameters.Add(new SqlParameter("@id", id));

            try
            {
                conexao.Open();

                SqlDataAdapter sdr = new SqlDataAdapter(comando);
                DataSet ds = new DataSet();

                sdr.Fill(ds, "Jogos");

                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public DataTable GetJogosByCliente(int cliente)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("select Jogos.* from Jogos inner join ClienteJogo on Jogos.ID = ClienteJogo.Jogo and ClienteJogo.Cliente = @cliente ", conexao);
            comando.Parameters.Add(new SqlParameter("@cliente", cliente));

            try
            {
                conexao.Open();

                SqlDataAdapter sdr = new SqlDataAdapter(comando);
                DataSet ds = new DataSet();

                sdr.Fill(ds, "Jogos");

                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public DataTable GetJogosByField(string colunaFiltro, string filtro)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand(@"
                    select * from Jogos left join Categoria on Jogos.Categoria = Categoria.ID 
                                        left join Produtora on Jogos.Produtora = Produtora.ID 
                    where " + colunaFiltro + " like '%' + @filtro + '%'", conexao);
            comando.Parameters.Add(new SqlParameter("@filtro", filtro));

            try
            {
                conexao.Open();

                SqlDataAdapter sdr = new SqlDataAdapter(comando);
                DataSet ds = new DataSet();

                sdr.Fill(ds, "Jogos");

                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public bool InsertJogos(int idProdutora, string titulo, string imagePath, string descricao, int categoria, double preco)
        {
            bool sucesso;
   
            SqlConnection conexao = new SqlConnection(_conectionString);

            SqlCommand comando = new SqlCommand("INSERT INTO Jogos VALUES (@Titulo, @Descricao, @Categoria,@IdProdutora, @Imagem, @Preco)", conexao);
            comando.Parameters.AddWithValue("@IdProdutora", idProdutora);
            comando.Parameters.AddWithValue("@Titulo", titulo);
            comando.Parameters.AddWithValue("@Imagem", imagePath);
            comando.Parameters.AddWithValue("@Descricao", descricao);
            comando.Parameters.AddWithValue("@Categoria", categoria);
            comando.Parameters.AddWithValue("@Preco", preco);

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
                sucesso = true;
            }
            catch (Exception ex)
            {
               throw new Exception(ex.Message);
             
            }
            finally
            {
                conexao.Close();
            }

            return sucesso;
        }

        [WebMethod]
        [ScriptMethod]
        public bool DeletarJogo(int idJogo)
        {
            bool sucesso;

            SqlConnection conexao = new SqlConnection(_conectionString);

            SqlCommand comando = new SqlCommand("DELETE FROM Jogos WHERE Jogos.Id = @jogoId ", conexao);
            comando.Parameters.AddWithValue("@jogoId", idJogo);

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
                sucesso = true;
            }
            catch (Exception)
            {
                throw new Exception("Fodeu!");
            }
            finally
            {
                conexao.Close();
            }

            return sucesso;
        }

        [WebMethod]
        [ScriptMethod]
        public bool UpdateJogo(int idJogo, int idProdutora, string titulo, string imagePath, string descricao, int categoria, double preco)
        {

            bool sucesso;

            string updateCommand = "UPDATE Jogos SET Nome = @titulo, Produtora = @IdProdutora, Foto = @imagePath, Descricao = @descricao, Categoria = @categoria, Preco = @preco " +
                                   "WHERE Jogos.ID = @idJogo";

            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand(updateCommand, conexao);
            comando.Parameters.AddWithValue("@idJogo", idJogo);
            comando.Parameters.AddWithValue("@titulo", titulo);
            comando.Parameters.AddWithValue("@IdProdutora", idProdutora);
            comando.Parameters.AddWithValue("@imagePath", imagePath);
            comando.Parameters.AddWithValue("@descricao", descricao);
            comando.Parameters.AddWithValue("@categoria", categoria);
            comando.Parameters.AddWithValue("@preco", preco);

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
                sucesso = true;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                conexao.Close();
            }

            return sucesso;
        }

        [WebMethod]
        [ScriptMethod]
        public void InsertClienteJogo(int idCliente, int idJogo)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("insert into ClienteJogo (Cliente, Jogo) values (@cliente, @jogo)", conexao);
            comando.Parameters.Add(new SqlParameter("@cliente", idCliente));
            comando.Parameters.Add(new SqlParameter("@jogo", idJogo));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public DataTable GetClientesJogos()
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("select * from ClienteJogo", conexao);

            try
            {
                conexao.Open();

                SqlDataAdapter sdr = new SqlDataAdapter(comando);
                DataSet ds = new DataSet();

                sdr.Fill(ds, "ClienteJogo");

                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }

            return new DataTable();

        }
        #endregion 

        #region Produtora
        [WebMethod]
        [ScriptMethod]
        public void InsertProdutora(string nome)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("insert into Produtora (nome) values (@nome)", conexao);
            comando.Parameters.Add(new SqlParameter("@nome", nome));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public void DeleteProdutora(int id)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("delete from Produtora where id = @id", conexao);
            comando.Parameters.Add(new SqlParameter("@id", id));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public void UpdateProdutora(int id, string nomeProdutora)
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("update Produtora set nome = @nome where id = @id", conexao);
            comando.Parameters.Add(new SqlParameter("@id", id));
            comando.Parameters.Add(new SqlParameter("@nome", nomeProdutora));

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }

        [WebMethod]
        [ScriptMethod]
        public DataTable GetAllProdutoras()
        {
            SqlConnection conexao = new SqlConnection(_conectionString);
            SqlCommand comando = new SqlCommand("select * from Produtora", conexao);

            try
            {
                conexao.Open();

                SqlDataAdapter sdr = new SqlDataAdapter(comando);
                DataSet ds = new DataSet();

                sdr.Fill(ds, "Produtora");

                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conexao.Close();
            }
        }
        #endregion
    }
}
